package java学习.第09章_异常处理;

/**
 * 异常指的并不是语法错误和逻辑错误。
 * 语法错了，编译不通过，不会产生字节码文件，根本不能运行。
 * 代码逻辑错误，只是没有得到想要的结果
 * <p>
 * Java中把不同的异常用不同的类表示，一旦发生某种异常，
 * 就创建该异常类型的对象，并且抛出（throw）。
 * 然后程序员可以捕获(catch)到这个异常对象，并处理；
 * 如果没有捕获(catch)这个异常对象，那么这个异常对象将会导致程序终止。
 */
public class A_异常的分类 {

    public static void main(String[] args) {
        Throwable t = new Throwable();
        //打印异常信息
        //包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。
        t.printStackTrace();
        System.out.println("11");
        System.err.println("555");//打印特殊的字符
    }
    /**
     * java.lang.Throwable
     *      是Java程序执行过程中发生的异常事件对应的类的 根父类
     *   其子类：
     *      1.Error     Java虚拟机无法解决的严重问题。
     *      2.Exception  因编程错误或偶然的外在因素导致的一般性问题
     *
     */
    class 异常{
        /**
         * Error
         *   Java虚拟机无法解决的严重问题。
         *      如：JVM系统内部错误、资源耗尽等严重情况。
         *          一般不编写针对性的代码进行处理。
         *          例如：StackOverflowError（栈内存溢出）和
         *               OutOfMemoryError（堆内存溢出，简称OOM）。
         */
        class 子异常1_错误{ }

        /**
         * Exception
         *     它因编程错误或偶然的外在因素导致的一般性问题，
         *     需要使用针对性的代码进行处理，使程序继续运行。
         *     否则一旦发生异常，程序也会挂掉。例如：
         *             空指针访问    试图读取不存在的文件
         *             网络连接中断  数组角标越界
         *  Java程序的执行分为编译时过程和运行时过程。
         *      有的错误只有在运行时才会发生。
         *   Exception此异常有很多子类
         *      但是分为：RuntimeException 和 其他
         *          RuntimeException ： 运行时异常
         *          其他 ： 编译时异常
         */
        class 子异常2_异常{
            /**
             *编译时期异常（即checked异常、受检异常）：
             *      在代码编译阶段，编译器就能明确警示当前代码可能发生（不是一定发生）xx异常，
             *      并明确督促程序员提前编写处理它的代码。
             *      如果程序员没有编写对应的异常处理代码，则编译器就会直接判定编译失败，
             *      从而不能生成字节码文件。
             *      通常，这类异常的发生不是由程序员的代码引起的，或者不是靠加简单判断就可以避免的，
             *          例如：FileNotFoundException（文件找不到异常）。
             */
            class 编译时异常{}

            /**
             * 运行时期异常 ： RuntimeException
             * 运行时期异常（即runtime异常、unchecked异常、非受检异常）：
             *      在代码编译阶段，编译器完全不做任何检查，无论该异常是否会发生，
             *      编译器都不给出任何提示。
             *      只有等代码运行起来并确实发生了xx异常，它才能被发现。
             *      通常，这类异常是由程序员的代码编写不当引起的，只要稍加判断，或者细心检查就可以避免。
             *          java.lang.RuntimeException类及它的子类都是运行时异常。
             *           比如：ArrayIndexOutOfBoundsException数组下标越界异常，
             *                ClassCastException类型转换异常。
             *
             */
            @Deprecated
            class 运行时异常{
                //运行不了  内部类不能使用 main的程序入口
                public static void main(String[] args){
                    //运行时异常
                    RuntimeException runtime = new RuntimeException();

                }
            }
        }
    }

}
